import {Component, OnInit, OnDestroy, ViewChild, ViewEncapsulation} from '@angular/core';
import {FormBuilder, FormGroup, Validators} from '@angular/forms';
import {MessagerService} from 'ng-easyui/components/messager/messager.service';
import {GoodsType} from '../../../globalModel/GoodsType';
import {GoodsService} from '../../../service/goods.service';
import {TreeGridComponent} from 'ng-easyui/components/treegrid/treegrid.component';
import {TreeUtil} from '../../../globalUtil/treeUtil';
import {Subscription} from 'rxjs';
import {AdminService} from '../../../service/admin.service';

@Component({
  selector: 'app-goods-type',
  templateUrl: './goods-type.component.html',
  styleUrls: ['./goods-type.component.css'],
  encapsulation: ViewEncapsulation.None
})
export class GoodsTypeComponent implements OnInit, OnDestroy {
  componentTitle = '商品类别管理'; // 组件标题
  adminVariableSubscription: Subscription = null; // 订阅对象
  // eui-datagrid（数据表格）
  loading = true; // 开启加载提示
  loadMsg = '正在加载..';
  data = [];
  @ViewChild(TreeGridComponent)
  private treeGridComponent: TreeGridComponent;
  selectRow = null; // 点击后选中的行,单条
  checkRow = []; // 点击复选框选中的行,多条
  editRow: GoodsType = new GoodsType(); // 存储当前正在编辑的数据
  coverType: number;
  // eui-dialog（添加、编辑）
  editDlgTitle = '添加、编辑商品类别信息';
  editDlgClosed = true; // 默认关闭弹框,false打开弹框
  // 表单
  itemForForm: FormGroup = null; // 表单对象
  formBtnDisabled = false; // 默认激活表单提交,true禁用表单提交
  placeholder = {name: {'title': '商品类型名称', 'prompt': '(2~10位汉子)'}};

  /**
   * 构造函数
   */
  constructor(
    private service: GoodsService,
    private formBuilder: FormBuilder,
    private messagerService: MessagerService,
    private adminService: AdminService) {
    // 创建表单对象
    this.createItemForForm(this.editRow);
    /**
     * 监听父组件推送的消息
     */
    this.adminVariableSubscription = adminService.adminObservable.subscribe(adminVariable => {
      /**
       * 删除回调事件
       */
      if (adminVariable.componentName === 'admin' && adminVariable.deleteSuccess !== null) {
        this.reset();
        if (adminVariable.deleteSuccess) {
          // 删除成功
          this.selectGoodsType(); // 查询商品类别信息
        }
      }
    });
  }

  /**
   * 初始化函数
   */
  ngOnInit() {
    this.selectGoodsType();
  }

  /**
   * 组件销毁
   */
  ngOnDestroy() {
    if (this.adminVariableSubscription) {
      this.adminVariableSubscription.unsubscribe(); // 取消订阅,防止内存泄漏
    }
  }

  /**
   * 获取商品类别信息
   */
  selectGoodsType() {
    this.service.selectGoodsType({}).subscribe(responseJson => {
        this.loading = false; // 关闭加载提示
        if (responseJson.code === 0) {
          this.data = TreeUtil.prototype.mergeByParentId(responseJson.data);
        }
      }
    );
  }

  /**
   * 点击删除按钮打开删除弹框
   */
  onOpenDeleteDlg(): void {
    this.checkRow = this.treeGridComponent.getCheckedRows(); // 获取所有check的数据
    if (this.checkRow.length > 0) {
      const id = this.checkRow.map(row => row.id).join(','); // 过滤数组中的id并转化成以逗号分隔的字符串
      this.adminService.pushAdminVariable({componentName: 'goodsType', deleteDlgClosed: false, id: id});
    } else {
      this.messagerService.alert({title: '温馨提示', msg: '请先选中需要删除的数据!', ok: '确定'});
    }
  }

  /**
   * 点击添加、编辑按钮打开弹框
   * @param param
   */
  onOpenEditDlg(param): void {
    if (param === 'add') {
      /*
        添加状态
       */
      this.editDlgTitle = '添加商品类型信息';
      this.createItemForForm(this.editRow); // 创建表单对象
      this.editDlgClosed = false; // 打开弹框
    } else {
      /*
        编辑状态
       */
      if (this.selectRow) {
        this.editDlgTitle = '编辑商品类型信息';
        this.editRow = this.selectRow;
        this.createItemForForm(this.editRow); // 创建表单对象
        this.editDlgClosed = false; // 打开弹框
      } else {
        this.messagerService.alert({title: '温馨提示', msg: '您还没有选择数据!', ok: '确定'});
      }
    }
  }

  /**
   * 创建表单对象
   */
  createItemForForm(editRow): void {
    this.itemForForm = this.formBuilder.group({
      'name': [editRow.name, [Validators.required, Validators.pattern('^[\u4e00-\u9fa5_a-zA-Z0-9]{2,10}$')]]
    });
  }

  /**
   * 保存添加、编辑-提交表单
   */
  onSubmitForm(itemForForm): void {
    this.formBtnDisabled = true; // 禁用表单提交
    if (this.editRow && this.editRow.id) {
      /*
        编辑状态
       */
      itemForForm.value.id = this.editRow.id; // 设置ID作为后台修改的凭证
      itemForForm.value.createTime = this.editRow.createTime;
      // 当前商品类型名称没有发生改变,不需要修改
      if (this.editRow.name === itemForForm.value.name) {
        itemForForm.value.name = null;
      }
    } else {
      /*
        添加状态
       */
      if (this.selectRow) {
        // 添加子节点---->
        itemForForm.value.parentId = this.selectRow.id;
        itemForForm.value.nodeLevel = this.selectRow.nodeLevel + 1;
      } else {
        // 添加根节点---->
        itemForForm.value.parentId = 'root';
        itemForForm.value.nodeLevel = 0;
      }
    }
    this.service.modifyGoodsType(itemForForm.value).subscribe(responseJson => {
      if (responseJson.code === 0) {
        /*
          操作成功
         */
        setTimeout(() => {
          this.selectGoodsType();
          this.editDlgClosed = true; // 关闭弹框
        }, 1000);
      } else {
        /*
          操作失败
         */
        this.formBtnDisabled = false; // 激活表单提交
      }
    });
  }

  /**
   * 刷新数据
   */
  onReLoad(): void {
    this.selectGoodsType();
    this.reset();
  }

  /**
   * 取消添加、编辑
   */
  onEditCancel(): void {
    this.editDlgClosed = true; // 关闭添加、编辑弹框
  }

  /**
   * 关闭弹框回调事件
   */
  onCloseDlg(): void {
    this.reset(); // 重置全局变量
  }

  /**
   * 重置全局参数
   */
  reset(): void {
    this.editRow = {};
    this.editDlgClosed = true;
    this.treeGridComponent.unselectRow(this.selectRow);
    this.selectRow = null;
    this.treeGridComponent.uncheckAllRows();
    this.checkRow = [];
    this.formBtnDisabled = false;
  }

}
